<?php
	/* Posizioni dei giocatori nella formazione */

	
	require_once(dirname(__FILE__) . '/../model/db_driver.php');
	require_once('calciatore.php'); //importa la classe CalciatoreFormazione
	
	function caricaFormazioneRisultati($teamId, $giornataA){
		return getFormazione($teamId, $giornataA, true);
	}
	
	function caricaFormazione($teamId, $giornata = 39){
		return getFormazione($teamId, $giornata, false);
	}
	
	function getFormazione($teamId, $giornata = 39, $blnPerRisultati = false){
		$PlayerId = 0;
		$Ruolo = 1;
		$Nome = 2;
		$Squadra = 3; //squadra del calciatore
		$Posizione = 4; //posizione nella formazione
		$PosizioneDesc = 5;
		$GiornataA = 6;
		$NomeSquadra = 7; //nome della fantasquadra
		$NomeAllenatore = 8; //nome e cognome dell'allenatore
		$UltimaModifica = 9; //data e ora dell'ultima modifica
		$ProssGiornataA = 10; //prossima giornata A
		$MediaVoto = 11; //media voto del giocatore
		
		$p = array(); //array dei portieri
		$d = array(); //array dei difensori
		$c = array(); //array dei centrocampisti
		$a = array(); //array degli attaccanti
		$db_driver = new DbDriver();
		$nome_squadra = '';
		$allenatore = '';
		$ultima_modifica='';
		$arr_formazione;
		try{
			if($blnPerRisultati)
				$arr_formazione = $db_driver->db_getFormazioneDefinitiva($teamId, $giornata);
			else
				$arr_formazione = $db_driver->db_getFormazione($teamId, $giornata);
		}catch (Exception $ex){
			echo $ex;
			return null;
		}
				
		/* i giocatori sono ordinati per ruolo e per posizione nella formazione*/
		if($arr_formazione != null){
			for($i=0; $i < count($arr_formazione); $i++){
				$cf = new CalciatoreFormazione(
					$arr_formazione[$i][$PlayerId],
					$arr_formazione[$i][$Nome],
					$arr_formazione[$i][$Ruolo],
					$arr_formazione[$i][$Squadra],
					$arr_formazione[$i][$Posizione],
					$arr_formazione[$i][$PosizioneDesc],
					$arr_formazione[$i][$MediaVoto]);
				if($cf->getRuolo()=='P'){
					array_push($p,$cf);
				}else if($cf->getRuolo()=='D'){
					array_push($d, $cf);	
				}else if($cf->getRuolo()=='C'){
					array_push($c, $cf);	
				}else if($cf->getRuolo()=='A'){
					array_push($a, $cf);	
				}
			}
			$nome_squadra = $arr_formazione[0][$NomeSquadra];
			$giornata = $arr_formazione[0][$ProssGiornataA];
			$allenatore = $arr_formazione[0][$NomeAllenatore]; // prima giornata per la quale non è stato inviata la formazione
			$ultima_modifica = $arr_formazione[0][$UltimaModifica];
		}else{
			//nessuna formazione specficata per questa giornata
			//echo"nessuna formazione specficata per questa giornata";
			return null;
			
		}
		$f = new Formazione($nome_squadra, $teamId, $allenatore, $p, $d, $c, $a);
		$f->setGiornata($giornata);
		$f->setUltimaModifica($ultima_modifica);
		return $f;
	}
    
    class Formazione {
    	
	    public static $TITOLARE = 0;
		public static $RISERVA_1 = 1;
		public static $RISERVA_2 = 2;
		public static $RISERVA_3 = 3;
		public static $RISERVA_4 = 4;
		public static $TRIBUNA = 5;

		private $nome_squadra;
		private $squaraId;
		private $allenatore;
		private $portieri = array(); 
		private $difensori = array(); 
		private $centrocampisti= array(); 
		private $attaccanti = array();
		private $giornata;
		private $ultima_modifica;
		private static $posizioni_formazione = array(0=>"TITOLARE", 
											1=>"I RISERVA",
											2=>"II RISERVA",
											3=>"III RISERVA",
											4=>"IV RISERVA",
											5=>"TRIBUNA");
		
		public function __construct($nome_squadra, $squadraId, $allenatore, $p, $d, $c, $a){
			$this->nome_squadra = $nome_squadra;
			$this->squadraId = $squadraId;
			$this->allenatore = $allenatore;
			$this->portieri = $p;
			$this->difensori = $d;
			$this->centrocampisti = $c;
			$this->attaccanti = $a;
		}
		
		public function __destruct(){
			$this->destroy($this->portieri);
			$this->destroy($this->difensori);
			$this->destroy($this->centrocampisti);
			$this->destroy($this->attaccanti);
		}
    	
		public function getSquadra(){
			return $this->nome_squadra;
		}
		
		public function getSquadraId(){
			return $this->squadraId;
		}
		
		public function getAllenatore(){
			return $this->allenatore;
		}

		/* 
		 * Portiere
		 */
		public function getPortiere($i){
		//Restituisce l'i-esimo portiere
			if($i < count($this->portieri)){
				//$arr = array_values($this->portieri);
				//return $arr[$posizione];
				return $this->portieri[$i];
			}else{
				return new CalciatoreVuoto();
			}
		}
		
		public function getPortierePos($posizione){
		//Restistuisce il portiere alla posizione specificata (titolare, riserva 1, ecc..)
			foreach($this->portieri as $p){
				if($p->getFormazione()==$posizione){
					return $p;
				}
			}
			return new CalciatoreVuoto();
		}
		
		public function getNumPortieri(){
			return $this->getNumCalciatori($this->portieri, Formazione::$TITOLARE);
		}
		
		public function getNumPortieriPos($posizione){
			return $this->getNumCalciatori($this->portieri, $posizione);
		}
		
		/* 
		 * Difensori
		 */
		public function getDifensore($i){
		/* Restituisce l'i-esimo difensore titolare*/
			return $this->getDifensorePos(Formazione::$TITOLARE, $i);	
		}
		
		public function getDifensorePos($posizione, $i){
		/* Restituisce l'i-esimo difensore nella posizione descritta */
			return $this->getCalciatore($this->difensori, $posizione, $i);
		}
		
		public function getNumDifensori(){
		/* Restiuisce il numero di difensori titolari */
			return $this->getNumDifensoriInPos(Formazione::$TITOLARE);	
		}
		
		public function getNumDifensoriInPos($posizione){
			return $this->getNumCalciatori($this->difensori, $posizione);
		}
		
		/* 
		 * Centrocampisti
		 */
		public function getCentrocampista($i){
		/* Restituisce l'i-esimo difensore titolare*/
			return $this->getCentrocampistaPos(Formazione::$TITOLARE, $i);	
		}
		
		public function getCentrocampistaPos($posizione, $i){
		/* Restituisce l'i-esimo difensore nella posizione descritta */
			return $this->getCalciatore($this->centrocampisti, $posizione, $i);
		}
		
		public function getNumCentrocampisti(){
		/* Restiuisce il numero di difensori titolari */
			return $this->getNumCentrocampistiInPos(Formazione::$TITOLARE);	
		}
		
		public function getNumCentrocampistiInPos($posizione){
			return $this->getNumCalciatori($this->centrocampisti, $posizione);
		}
		
		/* 
		 * Attaccanti
		 */
		public function getAttaccante($i){
		/* Restituisce l'i-esimo difensore titolare*/
			return $this->getAttaccantePos(Formazione::$TITOLARE, $i);	
		}
		
		public function getAttaccantePos($posizione, $i){
		/* Restituisce l'i-esimo difensore nella posizione descritta */
			return $this->getCalciatore($this->attaccanti, $posizione, $i);
		}
		
		public function getNumAttaccanti(){
		/* Restiuisce il numero di difensori titolari */
			return $this->getNumAttaccantiInPos(Formazione::$TITOLARE);	
		}
		
		public function getNumAttaccantiInPos($posizione){
			return $this->getNumCalciatori($this->attaccanti, $posizione);
		}
		
		public function getGiornata(){
			return $this->giornata; //restituisce la giornata del fantacampionato 
			//per la quale è stato schierata questa formazione
		}
		
		public function setGiornata($giornata){
			$this->giornata = $giornata;
		}
		
		public function getUltimaModifica(){
			return $this->ultima_modifica;
		}
		
		public function setUltimaModifica($ultima_modifica){
			return $this->ultima_modifica=$ultima_modifica;
		}
		
		public static function getPosizioneFormazione($i){
			if($i < count(self::$posizioni_formazione)){
				return self::$posizioni_formazione[$i];
			}else{
				return "";
			}
		} 
		
		public static function getNumPosizioni(){
			return count(self::$posizioni_formazione);
		}
		
		public function getGiocatore($id){
		//restituisce se lo trova il giocatore con questo id
			/*if(isset($portieri[$id])){
				return $poritieri[$id];
			}else {
				echo "portiere $id non trovato";
			}*/
			foreach($this->portieri as $p){
				if($p->getId()==$id) return $p;
			}
			foreach($this->difensori as $d){
				if($d->getId()==$id) return $d;
			}
			foreach($this->centrocampisti as $c){
				if($c->getId()==$id) return $c;
			}
			foreach($this->attaccanti as $a){
				if($a->getId()==$id) return $a;
			}
			return new CalciatoreVuoto();
		}
		
		public function salva(){
		//Salva sul DB il ruolo id ogni giocatore per questa giornata
			$db_driver = new DbDriver();
			$db_driver->aggiornaFormazione($this);
		}
		
		public function getAllPlayers(){
		/* restituisce una array con tutti i calciatori */
			$players = array();
			/*
			$this->pushPlayers($players, $this->portieri);
			$this->pushPlayers($players, $this->difensori);
			$this->pushPlayers($players, $this->centrocampisti);
			$this->pushPlayers($players, $this->attaccanti);*/
			$players = array_merge( $this->portieri, $this->difensori, $this->centrocampisti, $this->attaccanti);
			return $players;
		}
		
		
		public function serializza(){
		/* Crea una matrice con id giocatore, nome giocatore e posizione formazione per ogni giocatore*/
			$csv = '';
			$csv = $this->serializeArray($this->portieri);
			$csv = $csv . $this->serializeArray($this->difensori);
			$csv = $csv . $this->serializeArray($this->centrocampisti);
			$csv = $csv . $this->serializeArray($this->attaccanti);
			return $csv;
		}
		
		private function serializeArray($arr){
			$csv = "";
			foreach($arr as $p){
				$csv = $csv . $p->getRuolo() . ";" . $p->getNome() . ";" . $p->getDescrizione() . "; \n";
			}
			return $csv;
		}
		
		private function pushPlayers($in_array, $players_array){
			foreach($players_array as $p){
				array_push($in_array, $p);
			}
		}
		
		
		private function getCalciatore($arr, $posizione, $i){
		/* Parametri:
		 * $arr: array dei voti di questa giornata
		 * $posizione: TITOLARE, RISERVA_1, RISERVA_2, ecc.
		 * $i: i-esima posizione in cui cercare il giocatore (ha senso solo quando $posizione=TITOLARE)*/
			for($j=0;$j < count($arr); $j++){
				
				if($arr[$j]->getFormazione()==$posizione){
					if(--$i==-1)
						return $arr[$j];
				}
			}
			return null;
		}
		
		private function getNumCalciatori($arr, $posizione){
		//Restituisce il numero di calciatori in questo posizione
		//nell'array passato
			$n = 0;
			for($i=0; $i < count($arr); $i++){
				//echo $arr[$i]->getNome() . " " . $arr[$i]->getFormazione() . "|" . $posizione . "<br />";
				if($arr[$i]->getFormazione()==$posizione){
					$n++;
				}
			}
			return $n;
		}
		
		private function destroy($players_arr){
			foreach($players_arr as $p){
				$p->__destruct();
			}
		}

    }
?>